/*
 * @Author: your name
 * @Date: 2021-04-09 17:00:55
 * @LastEditTime: 2021-04-09 17:00:55
 * @LastEditors: your name
 * @Description: In User Settings Edit
 * @FilePath: \TypeScript\17-联合类型.ts
 */
// 联合类型 Union Types
// 联合类型表示一个值可以是几种类型之一
// 我们用竖线（|）分割每个类型，所以number|string|boolean表示一个值可以是number，string或boolean
function padLeft(value: string, padding: string | number) {
    if (typeof padding === 'number') {
        return Array(padding + 1).join(" ") + value;
    }
    if (typeof padding === 'string') {
        return padding + value;
    }
    throw new Error(`Expected string or number, got '${padding}'.`);
}
// 报错因为false不是字符串伙食数字
padLeft("Hello world", false);


// 如果一个值是联合类型，我们只能访问此连个类型的所有类型里共有的成员
// 如股票一个值的类型是 A|B ， 我们能能够确定的是它包含了 A和B的共有成员，
// 这个例子里，Bird具有一个fly成员。 但是Fish里面没有fly。如果变量在运行时是Fish类型，那么调用pet.fly()就出错了

interface Bird{
    fly();
    layEggs();
}
interface Fish {
    swim();
    layEggs();
}
function getSumallPet(): Fish | Bird {
    return {
        layEggs(){},
        swim(){},
        fly(){}
    }
}
let pet = getSumallPet();
pet.layEggs();
// Bird和Fish不存在swim属性
pet.swim();






